/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package models.negocio;

import config.LogErro;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import models.dados.HibernateDAO;
import models.dados.HibernateUtil;
import models.entidades.AtributoTabAux;
import models.entidades.Procedimento;
import models.entidades.TabAux;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Wenderson
 */
public class NegocioAtributoAux extends HibernateDAO<AtributoTabAux, Integer> {
    
    public NegocioAtributoAux() { 
        super(AtributoTabAux.class);
    }
    
    public HashMap<String, String> getNomeTipo(Procedimento procedimento) {
        try {
            String sql = "SELECT ta.nome, ta.tipo_dado FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                //"INNER JOIN Chave_Natural_Aux ca ON (ca.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "WHERE p.cd_procedimento = ? ";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
        //TODO: GET NOME TIPO 
//        try {
//            Criteria c = HibernateUtil.getSession().createCriteria(AtributoTabAux.class, "ad");
//            c.createAlias("tabAux", "ta", Criteria.INNER_JOIN, Restrictions.eq("ta.cdTabAux", tabAux.getCdTabAux()));
//            c.setProjection(Projections.projectionList()
//                    .add(Projections.property("ad.nome"))
//                    .add(Projections.property("ad.tipoDado")));
//            
//            List<Object[]> lista = c.list();
//
//            HashMap<String, String> map = new HashMap<String, String>();
//            
//            for (Object[] objects : lista) {
//                map.put(objects[0].toString(), objects[1].toString());
//            }
//            
//            return map;
//        } catch (Exception e) {
//            LogErro.gravaErro(e);e.printStackTrace();
//        }
//        return null;
    }

    public HashMap<String, String> getChavesReferenciadas(Procedimento procedimento) {
        try {
            String sql = "SELECT ta.nome, td.nome FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                "INNER JOIN Chave_Natural_Aux ca ON (ca.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "WHERE p.cd_procedimento = ?";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }
    
    public HashMap<String, String> getAtributosReferenciados(Procedimento procedimento) {
        try {
            String sql = "SELECT ta.nome, td.nome FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "WHERE p.cd_procedimento = ? ";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public HashMap<String, String> getAtributosNaoChaves(Procedimento procedimento, int tipo_atributo) {
        try {
            String sql = "SELECT ta.nome, td.nome FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                //"INNER JOIN Chave_Natural_Aux ca ON (ca.cd_at_tab_aux <> r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "INNER JOIN Comportamento_Atributo ct ON (ct.cd_comp_atr = td.cd_comp_atr)" +
                "WHERE p.cd_procedimento = ? AND ct.tipo = ?  AND l.fl_trans = 'N' " +
                "AND TA.CD_AT_TAB_AUX NOT IN (SELECT CA.CD_AT_TAB_AUX FROM CHAVE_NATURAL_AUX CA)";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .setInteger(1, tipo_atributo)
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public HashMap<String, String> getAtributosNaoChavesNull(Procedimento procedimento, int tipo_atributo, int nulidade) {
        try {
            String sql = "SELECT ta.nome, ta.tipo_dado FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                "INNER JOIN Chave_Natural_Aux ca ON (ca.cd_at_tab_aux <> r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "INNER JOIN Comportamento_Atributo ct ON (ct.cd_comp_atr = td.cd_comp_atr)" +
                "INNER JOIN Restricao_Nulidade rn ON (rn.cd_nulidade = ta.cd_nulidade AND rn.cd_nulidade = td.cd_nulidade) " +
                "WHERE p.cd_procedimento = ? AND ct.tipo = ?  AND ta.cd_nulidade = ? AND l.fl_trans = 'N'";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .setInteger(1, tipo_atributo)
                    .setInteger(2, nulidade)
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }

    public HashMap<String, String> getAtributosNaoChavesChar(Procedimento procedimento, int tipo_atributo) {
        try {
            String sql = "SELECT ta.nome, ta.tipo_dado FROM Procedimento p " +
                "INNER JOIN Ligacao l ON (l.cd_procedimento = p.cd_procedimento) " +
                "INNER JOIN Referencia r ON (r.cd_referencia = l.cd_referencia) " +
                "INNER JOIN Chave_Natural_Aux ca ON (ca.cd_at_tab_aux <> r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Tab_Aux ta ON (ta.cd_at_tab_aux = r.cd_at_tab_aux) " +
                "INNER JOIN Atributo_Dimensao td ON (td.cd_at_dimensao = r.cd_at_dimensao) " +
                "INNER JOIN Comportamento_Atributo ct ON (ct.cd_comp_atr = td.cd_comp_atr)" +
                "WHERE p.cd_procedimento = ? AND ct.tipo = ?  AND (ta.tipo_dado = ? OR ta.tipo_dado = ?) AND l.fl_trans = 'N'";
            
//            Query query = HibernateUtil.getSession().createQuery(sql);
//            query.setInteger(1, procedimento.getCdProcedimento());
            
            List<Object[]> lista = HibernateUtil.getSession().createSQLQuery(sql)
                    .setInteger(0, procedimento.getCdProcedimento())
                    .setInteger(1, tipo_atributo)
                    .setString(2, "VARCHAR")
                    .setString(3, "CHAR")
                    .list();//query.list();
            
            HashMap<String, String> chaves = new HashMap<String, String>();
            
            for (Object[] objects : lista) {
                chaves.put(objects[0].toString(), objects[1].toString());
            }
            
            return chaves;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return null;
    }
}
